package com.ideal.lx_mss.utils;

import com.alibaba.fastjson.JSON;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.logging.log4j.util.PropertiesUtil;
import org.springframework.stereotype.Component;

import java.io.*;
import java.text.SimpleDateFormat;
import java.util.*;
@Component
public class CsvUtils {

    PropertiesUtil properties = new PropertiesUtil("application.properties");
    SimpleDateFormat sdf = new SimpleDateFormat("yyMMdd");

    public boolean saveCvs(List<Map<String,Object>> list, String topic,String pullId){
        String basiPath = properties.getStringProperty("kafka.dataFileUrl");
        // 检查 List 是否为空或为 null
        if (list == null || list.isEmpty()) {
            return false;
        }
        String fileData = sdf.format(new Date());
        String uuid = UUID.randomUUID().toString();

        String fileName = basiPath+"/"+topic+"/"+fileData;

        File folder = new File(fileName);

        // 判断文件夹是否存在
        if (!folder.exists()) {
            // 不存在则生成文件夹
            boolean result = folder.mkdirs();
            if (result) {
                System.out.println("文件夹生成成功！");
            } else {
                System.out.println("文件夹生成失败！");
            }
        } else {
            System.out.println("文件夹已经存在！");
        }

        String file = fileName+"/"+uuid+".csv";



        // 从第一个 HashMap 获取键集合作为列标题
        List<String> headers = new ArrayList<>(list.get(0).keySet());

        // 打开文件写入器，用于写入文件
        try (FileWriter csvWriter = new FileWriter(file)) {
            // 写入标题头
            csvWriter.append(String.join(",", headers));
            csvWriter.append("\n");

            // 依次遍历并写入数据行
            for (Map<String, Object> map : list) {
                List<String> data = new ArrayList<>();
                for (String header : headers) {
                    Object value = map.get(header);
                    String valueAsString = value == null ? "" : escapeSpecialCharacters(value.toString());
                    data.add(valueAsString);
                }
                csvWriter.append(String.join(",", data));
                csvWriter.append("\n");
            }
        } catch (IOException e) {
            e.printStackTrace();
            return false; // 发生异常时返回 false
        }

        return true; // 操作成功后返回true
    }




    public boolean saveCvsSing(List<String> list, String topic,String pullId){
        String basiPath = properties.getStringProperty("kafka.dataFileUrl");
        // 检查 List 是否为空或为 null
        if (list == null || list.isEmpty()) {
            return false;
        }
        String fileData = sdf.format(new Date());
        String uuid = UUID.randomUUID().toString();

        String fileName = basiPath+"/"+topic+"/"+fileData;

        File folder = new File(fileName);

        // 判断文件夹是否存在
        if (!folder.exists()) {
            // 不存在则生成文件夹
            boolean result = folder.mkdirs();
            if (result) {
                System.out.println("文件夹生成成功！");
            } else {
                System.out.println("文件夹生成失败！");
            }
        } else {
            System.out.println("文件夹已经存在！");
        }

        String file = fileName+"/"+uuid+".csv";


        // 打开文件写入器，用于写入文件
        try (FileWriter csvWriter = new FileWriter(file)) {

            // 依次遍历并写入数据行
            for (String str : list) {
                csvWriter.append('\"');             // 添加双引号开始
                csvWriter.append(str.replace("\"", "\"\"")); // 替换内部的双引号，以符合CSV规范
                csvWriter.append('\"');             // 添加双引号结束
                csvWriter.append('\n');             // 添加换行符，以便下一个字符串在新的一行
            }

        } catch (IOException e) {
            e.printStackTrace();
            return false; // 发生异常时返回 false
        }

        return true; // 操作成功后返回true
    }

    public String escapeSpecialCharacters(String data) {
        String escapedData = data.replaceAll("\\R", " ");
        if (data.contains(",") || data.contains("\"") || data.contains("'")) {
            data = data.replace("\"", "\"\"");
            escapedData = "\"" + data + "\"";
        }
        return escapedData;
    }





}
